home *** CD-ROM | disk | FTP | other *** search
/ Freelog 115 / FreelogNo115-MaiJuin2013.iso / Internet / Filezilla Server / FileZilla_Server-0_9_41.exe / source / includes / openssl / asn1_mac.h < prev    next >
C/C++ Source or Header  |  2012-02-26  |  19KB  |  572 lines

  1. /* crypto/asn1/asn1_mac.h */
  2. /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  3.  * All rights reserved.
  4.  *
  5.  * This package is an SSL implementation written
  6.  * by Eric Young (eay@cryptsoft.com).
  7.  * The implementation was written so as to conform with Netscapes SSL.
  8.  * 
  9.  * This library is free for commercial and non-commercial use as long as
  10.  * the following conditions are aheared to.  The following conditions
  11.  * apply to all code found in this distribution, be it the RC4, RSA,
  12.  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
  13.  * included with this distribution is covered by the same copyright terms
  14.  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
  15.  * 
  16.  * Copyright remains Eric Young's, and as such any Copyright notices in
  17.  * the code are not to be removed.
  18.  * If this package is used in a product, Eric Young should be given attribution
  19.  * as the author of the parts of the library used.
  20.  * This can be in the form of a textual message at program startup or
  21.  * in documentation (online or textual) provided with the package.
  22.  * 
  23.  * Redistribution and use in source and binary forms, with or without
  24.  * modification, are permitted provided that the following conditions
  25.  * are met:
  26.  * 1. Redistributions of source code must retain the copyright
  27.  *    notice, this list of conditions and the following disclaimer.
  28.  * 2. Redistributions in binary form must reproduce the above copyright
  29.  *    notice, this list of conditions and the following disclaimer in the
  30.  *    documentation and/or other materials provided with the distribution.
  31.  * 3. All advertising materials mentioning features or use of this software
  32.  *    must display the following acknowledgement:
  33.  *    "This product includes cryptographic software written by
  34.  *     Eric Young (eay@cryptsoft.com)"
  35.  *    The word 'cryptographic' can be left out if the rouines from the library
  36.  *    being used are not cryptographic related :-).
  37.  * 4. If you include any Windows specific code (or a derivative thereof) from 
  38.  *    the apps directory (application code) you must include an acknowledgement:
  39.  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
  40.  * 
  41.  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
  42.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  43.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  44.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  45.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  46.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  47.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  48.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  49.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  50.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  51.  * SUCH DAMAGE.
  52.  * 
  53.  * The licence and distribution terms for any publically available version or
  54.  * derivative of this code cannot be changed.  i.e. this code cannot simply be
  55.  * copied and put under another distribution licence
  56.  * [including the GNU Public Licence.]
  57.  */
  58.  
  59. #ifndef HEADER_ASN1_MAC_H
  60. #define HEADER_ASN1_MAC_H
  61.  
  62. #include <openssl/asn1.h>
  63.  
  64. #ifdef  __cplusplus
  65. extern "C" {
  66. #endif
  67.  
  68. #ifndef ASN1_MAC_ERR_LIB
  69. #define ASN1_MAC_ERR_LIB    ERR_LIB_ASN1
  70. #endif 
  71.  
  72. #define ASN1_MAC_H_err(f,r,line) \
  73.     ERR_PUT_error(ASN1_MAC_ERR_LIB,(f),(r),__FILE__,(line))
  74.  
  75. #define M_ASN1_D2I_vars(a,type,func) \
  76.     ASN1_const_CTX c; \
  77.     type ret=NULL; \
  78.     \
  79.     c.pp=(const unsigned char **)pp; \
  80.     c.q= *(const unsigned char **)pp; \
  81.     c.error=ERR_R_NESTED_ASN1_ERROR; \
  82.     if ((a == NULL) || ((*a) == NULL)) \
  83.         { if ((ret=(type)func()) == NULL) \
  84.             { c.line=__LINE__; goto err; } } \
  85.     else    ret=(*a);
  86.  
  87. #define M_ASN1_D2I_Init() \
  88.     c.p= *(const unsigned char **)pp; \
  89.     c.max=(length == 0)?0:(c.p+length);
  90.  
  91. #define M_ASN1_D2I_Finish_2(a) \
  92.     if (!asn1_const_Finish(&c)) \
  93.         { c.line=__LINE__; goto err; } \
  94.     *(const unsigned char **)pp=c.p; \
  95.     if (a != NULL) (*a)=ret; \
  96.     return(ret);
  97.  
  98. #define M_ASN1_D2I_Finish(a,func,e) \
  99.     M_ASN1_D2I_Finish_2(a); \
  100. err:\
  101.     ASN1_MAC_H_err((e),c.error,c.line); \
  102.     asn1_add_error(*(const unsigned char **)pp,(int)(c.q- *pp)); \
  103.     if ((ret != NULL) && ((a == NULL) || (*a != ret))) func(ret); \
  104.     return(NULL)
  105.  
  106. #define M_ASN1_D2I_start_sequence() \
  107.     if (!asn1_GetSequence(&c,&length)) \
  108.         { c.line=__LINE__; goto err; }
  109. /* Begin reading ASN1 without a surrounding sequence */
  110. #define M_ASN1_D2I_begin() \
  111.     c.slen = length;
  112.  
  113. /* End reading ASN1 with no check on length */
  114. #define M_ASN1_D2I_Finish_nolen(a, func, e) \
  115.     *pp=c.p; \
  116.     if (a != NULL) (*a)=ret; \
  117.     return(ret); \
  118. err:\
  119.     ASN1_MAC_H_err((e),c.error,c.line); \
  120.     asn1_add_error(*pp,(int)(c.q- *pp)); \
  121.     if ((ret != NULL) && ((a == NULL) || (*a != ret))) func(ret); \
  122.     return(NULL)
  123.  
  124. #define M_ASN1_D2I_end_sequence() \
  125.     (((c.inf&1) == 0)?(c.slen <= 0): \
  126.         (c.eos=ASN1_const_check_infinite_end(&c.p,c.slen)))
  127.  
  128. /* Don't use this with d2i_ASN1_BOOLEAN() */
  129. #define M_ASN1_D2I_get(b, func) \
  130.     c.q=c.p; \
  131.     if (func(&(b),&c.p,c.slen) == NULL) \
  132.         {c.line=__LINE__; goto err; } \
  133.     c.slen-=(c.p-c.q);
  134.  
  135. /* Don't use this with d2i_ASN1_BOOLEAN() */
  136. #define M_ASN1_D2I_get_x(type,b,func) \
  137.     c.q=c.p; \
  138.     if (((D2I_OF(type))func)(&(b),&c.p,c.slen) == NULL) \
  139.         {c.line=__LINE__; goto err; } \
  140.     c.slen-=(c.p-c.q);
  141.  
  142. /* use this instead () */
  143. #define M_ASN1_D2I_get_int(b,func) \
  144.     c.q=c.p; \
  145.     if (func(&(b),&c.p,c.slen) < 0) \
  146.         {c.line=__LINE__; goto err; } \
  147.     c.slen-=(c.p-c.q);
  148.  
  149. #define M_ASN1_D2I_get_opt(b,func,type) \
  150.     if ((c.slen != 0) && ((M_ASN1_next & (~V_ASN1_CONSTRUCTED)) \
  151.         == (V_ASN1_UNIVERSAL|(type)))) \
  152.         { \
  153.         M_ASN1_D2I_get(b,func); \
  154.         }
  155.  
  156. #define M_ASN1_D2I_get_imp(b,func, type) \
  157.     M_ASN1_next=(_tmp& V_ASN1_CONSTRUCTED)|type; \
  158.     c.q=c.p; \
  159.     if (func(&(b),&c.p,c.slen) == NULL) \
  160.         {c.line=__LINE__; M_ASN1_next_prev = _tmp; goto err; } \
  161.     c.slen-=(c.p-c.q);\
  162.     M_ASN1_next_prev=_tmp;
  163.  
  164. #define M_ASN1_D2I_get_IMP_opt(b,func,tag,type) \
  165.     if ((c.slen != 0) && ((M_ASN1_next & (~V_ASN1_CONSTRUCTED)) == \
  166.         (V_ASN1_CONTEXT_SPECIFIC|(tag)))) \
  167.         { \
  168.         unsigned char _tmp = M_ASN1_next; \
  169.         M_ASN1_D2I_get_imp(b,func, type);\
  170.         }
  171.  
  172. #define M_ASN1_D2I_get_set(r,func,free_func) \
  173.         M_ASN1_D2I_get_imp_set(r,func,free_func, \
  174.             V_ASN1_SET,V_ASN1_UNIVERSAL);
  175.  
  176. #define M_ASN1_D2I_get_set_type(type,r,func,free_func) \
  177.         M_ASN1_D2I_get_imp_set_type(type,r,func,free_func, \
  178.             V_ASN1_SET,V_ASN1_UNIVERSAL);
  179.  
  180. #define M_ASN1_D2I_get_set_opt(r,func,free_func) \
  181.     if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \
  182.         V_ASN1_CONSTRUCTED|V_ASN1_SET)))\
  183.         { M_ASN1_D2I_get_set(r,func,free_func); }
  184.  
  185. #define M_ASN1_D2I_get_set_opt_type(type,r,func,free_func) \
  186.     if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \
  187.         V_ASN1_CONSTRUCTED|V_ASN1_SET)))\
  188.         { M_ASN1_D2I_get_set_type(type,r,func,free_func); }
  189.  
  190. #define M_ASN1_I2D_len_SET_opt(a,f) \
  191.     if ((a != NULL) && (sk_num(a) != 0)) \
  192.         M_ASN1_I2D_len_SET(a,f);
  193.  
  194. #define M_ASN1_I2D_put_SET_opt(a,f) \
  195.     if ((a != NULL) && (sk_num(a) != 0)) \
  196.         M_ASN1_I2D_put_SET(a,f);
  197.  
  198. #define M_ASN1_I2D_put_SEQUENCE_opt(a,f) \
  199.     if ((a != NULL) && (sk_num(a) != 0)) \
  200.         M_ASN1_I2D_put_SEQUENCE(a,f);
  201.  
  202. #define M_ASN1_I2D_put_SEQUENCE_opt_type(type,a,f) \
  203.     if ((a != NULL) && (sk_##type##_num(a) != 0)) \
  204.         M_ASN1_I2D_put_SEQUENCE_type(type,a,f);
  205.  
  206. #define M_ASN1_D2I_get_IMP_set_opt(b,func,free_func,tag) \
  207.     if ((c.slen != 0) && \
  208.         (M_ASN1_next == \
  209.         (V_ASN1_CONTEXT_SPECIFIC|V_ASN1_CONSTRUCTED|(tag))))\
  210.         { \
  211.         M_ASN1_D2I_get_imp_set(b,func,free_func,\
  212.             tag,V_ASN1_CONTEXT_SPECIFIC); \
  213.         }
  214.  
  215. #define M_ASN1_D2I_get_IMP_set_opt_type(type,b,func,free_func,tag) \
  216.     if ((c.slen != 0) && \
  217.         (M_ASN1_next == \
  218.         (V_ASN1_CONTEXT_SPECIFIC|V_ASN1_CONSTRUCTED|(tag))))\
  219.         { \
  220.         M_ASN1_D2I_get_imp_set_type(type,b,func,free_func,\
  221.             tag,V_ASN1_CONTEXT_SPECIFIC); \
  222.         }
  223.  
  224. #define M_ASN1_D2I_get_seq(r,func,free_func) \
  225.         M_ASN1_D2I_get_imp_set(r,func,free_func,\
  226.             V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL);
  227.  
  228. #define M_ASN1_D2I_get_seq_type(type,r,func,free_func) \
  229.         M_ASN1_D2I_get_imp_set_type(type,r,func,free_func,\
  230.                         V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL)
  231.  
  232. #define M_ASN1_D2I_get_seq_opt(r,func,free_func) \
  233.     if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \
  234.         V_ASN1_CONSTRUCTED|V_ASN1_SEQUENCE)))\
  235.         { M_ASN1_D2I_get_seq(r,func,free_func); }
  236.  
  237. #define M_ASN1_D2I_get_seq_opt_type(type,r,func,free_func) \
  238.     if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \
  239.         V_ASN1_CONSTRUCTED|V_ASN1_SEQUENCE)))\
  240.         { M_ASN1_D2I_get_seq_type(type,r,func,free_func); }
  241.  
  242. #define M_ASN1_D2I_get_IMP_set(r,func,free_func,x) \
  243.         M_ASN1_D2I_get_imp_set(r,func,free_func,\
  244.             x,V_ASN1_CONTEXT_SPECIFIC);
  245.  
  246. #define M_ASN1_D2I_get_IMP_set_type(type,r,func,free_func,x) \
  247.         M_ASN1_D2I_get_imp_set_type(type,r,func,free_func,\
  248.             x,V_ASN1_CONTEXT_SPECIFIC);
  249.  
  250. #define M_ASN1_D2I_get_imp_set(r,func,free_func,a,b) \
  251.     c.q=c.p; \
  252.     if (d2i_ASN1_SET(&(r),&c.p,c.slen,(char *(*)())func,\
  253.         (void (*)())free_func,a,b) == NULL) \
  254.         { c.line=__LINE__; goto err; } \
  255.     c.slen-=(c.p-c.q);
  256.  
  257. #define M_ASN1_D2I_get_imp_set_type(type,r,func,free_func,a,b) \
  258.     c.q=c.p; \
  259.     if (d2i_ASN1_SET_OF_##type(&(r),&c.p,c.slen,func,\
  260.                    free_func,a,b) == NULL) \
  261.         { c.line=__LINE__; goto err; } \
  262.     c.slen-=(c.p-c.q);
  263.  
  264. #define M_ASN1_D2I_get_set_strings(r,func,a,b) \
  265.     c.q=c.p; \
  266.     if (d2i_ASN1_STRING_SET(&(r),&c.p,c.slen,a,b) == NULL) \
  267.         { c.line=__LINE__; goto err; } \
  268.     c.slen-=(c.p-c.q);
  269.  
  270. #define M_ASN1_D2I_get_EXP_opt(r,func,tag) \
  271.     if ((c.slen != 0L) && (M_ASN1_next == \
  272.         (V_ASN1_CONSTRUCTED|V_ASN1_CONTEXT_SPECIFIC|tag))) \
  273.         { \
  274.         int Tinf,Ttag,Tclass; \
  275.         long Tlen; \
  276.         \
  277.         c.q=c.p; \
  278.         Tinf=ASN1_get_object(&c.p,&Tlen,&Ttag,&Tclass,c.slen); \
  279.         if (Tinf & 0x80) \
  280.             { c.error=ERR_R_BAD_ASN1_OBJECT_HEADER; \
  281.             c.line=__LINE__; goto err; } \
  282.         if (Tinf == (V_ASN1_CONSTRUCTED+1)) \
  283.                     Tlen = c.slen - (c.p - c.q) - 2; \
  284.         if (func(&(r),&c.p,Tlen) == NULL) \
  285.             { c.line=__LINE__; goto err; } \
  286.         if (Tinf == (V_ASN1_CONSTRUCTED+1)) { \
  287.             Tlen = c.slen - (c.p - c.q); \
  288.             if(!ASN1_const_check_infinite_end(&c.p, Tlen)) \
  289.                 { c.error=ERR_R_MISSING_ASN1_EOS; \
  290.                 c.line=__LINE__; goto err; } \
  291.         }\
  292.         c.slen-=(c.p-c.q); \
  293.         }
  294.  
  295. #define M_ASN1_D2I_get_EXP_set_opt(r,func,free_func,tag,b) \
  296.     if ((c.slen != 0) && (M_ASN1_next == \
  297.         (V_ASN1_CONSTRUCTED|V_ASN1_CONTEXT_SPECIFIC|tag))) \
  298.         { \
  299.         int Tinf,Ttag,Tclass; \
  300.         long Tlen; \
  301.         \
  302.         c.q=c.p; \
  303.         Tinf=ASN1_get_object(&c.p,&Tlen,&Ttag,&Tclass,c.slen); \
  304.         if (Tinf & 0x80) \
  305.             { c.error=ERR_R_BAD_ASN1_OBJECT_HEADER; \
  306.             c.line=__LINE__; goto err; } \
  307.         if (Tinf == (V_ASN1_CONSTRUCTED+1)) \
  308.                     Tlen = c.slen - (c.p - c.q) - 2; \
  309.         if (d2i_ASN1_SET(&(r),&c.p,Tlen,(char *(*)())func, \
  310.             (void (*)())free_func, \
  311.             b,V_ASN1_UNIVERSAL) == NULL) \
  312.             { c.line=__LINE__; goto err; } \
  313.         if (Tinf == (V_ASN1_CONSTRUCTED+1)) { \
  314.             Tlen = c.slen - (c.p - c.q); \
  315.             if(!ASN1_check_infinite_end(&c.p, Tlen)) \
  316.                 { c.error=ERR_R_MISSING_ASN1_EOS; \
  317.                 c.line=__LINE__; goto err; } \
  318.         }\
  319.         c.slen-=(c.p-c.q); \
  320.         }
  321.  
  322. #define M_ASN1_D2I_get_EXP_set_opt_type(type,r,func,free_func,tag,b) \
  323.     if ((c.slen != 0) && (M_ASN1_next == \
  324.         (V_ASN1_CONSTRUCTED|V_ASN1_CONTEXT_SPECIFIC|tag))) \
  325.         { \
  326.         int Tinf,Ttag,Tclass; \
  327.         long Tlen; \
  328.         \
  329.         c.q=c.p; \
  330.         Tinf=ASN1_get_object(&c.p,&Tlen,&Ttag,&Tclass,c.slen); \
  331.         if (Tinf & 0x80) \
  332.             { c.error=ERR_R_BAD_ASN1_OBJECT_HEADER; \
  333.             c.line=__LINE__; goto err; } \
  334.         if (Tinf == (V_ASN1_CONSTRUCTED+1)) \
  335.                     Tlen = c.slen - (c.p - c.q) - 2; \
  336.         if (d2i_ASN1_SET_OF_##type(&(r),&c.p,Tlen,func, \
  337.             free_func,b,V_ASN1_UNIVERSAL) == NULL) \
  338.             { c.line=__LINE__; goto err; } \
  339.         if (Tinf == (V_ASN1_CONSTRUCTED+1)) { \
  340.             Tlen = c.slen - (c.p - c.q); \
  341.             if(!ASN1_check_infinite_end(&c.p, Tlen)) \
  342.                 { c.error=ERR_R_MISSING_ASN1_EOS; \
  343.                 c.line=__LINE__; goto err; } \
  344.         }\
  345.         c.slen-=(c.p-c.q); \
  346.         }
  347.  
  348. /* New macros */
  349. #define M_ASN1_New_Malloc(ret,type) \
  350.     if ((ret=(type *)OPENSSL_malloc(sizeof(type))) == NULL) \
  351.         { c.line=__LINE__; goto err2; }
  352.  
  353. #define M_ASN1_New(arg,func) \
  354.     if (((arg)=func()) == NULL) return(NULL)
  355.  
  356. #define M_ASN1_New_Error(a) \
  357. /*    err:    ASN1_MAC_H_err((a),ERR_R_NESTED_ASN1_ERROR,c.line); \
  358.         return(NULL);*/ \
  359.     err2:    ASN1_MAC_H_err((a),ERR_R_MALLOC_FAILURE,c.line); \
  360.         return(NULL)
  361.  
  362.  
  363. /* BIG UGLY WARNING!  This is so damn ugly I wanna puke.  Unfortunately,
  364.    some macros that use ASN1_const_CTX still insist on writing in the input
  365.    stream.  ARGH!  ARGH!  ARGH!  Let's get rid of this macro package.
  366.    Please?                        -- Richard Levitte */
  367. #define M_ASN1_next        (*((unsigned char *)(c.p)))
  368. #define M_ASN1_next_prev    (*((unsigned char *)(c.q)))
  369.  
  370. /*************************************************/
  371.  
  372. #define M_ASN1_I2D_vars(a)    int r=0,ret=0; \
  373.                 unsigned char *p; \
  374.                 if (a == NULL) return(0)
  375.  
  376. /* Length Macros */
  377. #define M_ASN1_I2D_len(a,f)    ret+=f(a,NULL)
  378. #define M_ASN1_I2D_len_IMP_opt(a,f)    if (a != NULL) M_ASN1_I2D_len(a,f)
  379.  
  380. #define M_ASN1_I2D_len_SET(a,f) \
  381.         ret+=i2d_ASN1_SET(a,NULL,f,V_ASN1_SET,V_ASN1_UNIVERSAL,IS_SET);
  382.  
  383. #define M_ASN1_I2D_len_SET_type(type,a,f) \
  384.         ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,V_ASN1_SET, \
  385.                         V_ASN1_UNIVERSAL,IS_SET);
  386.  
  387. #define M_ASN1_I2D_len_SEQUENCE(a,f) \
  388.         ret+=i2d_ASN1_SET(a,NULL,f,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL, \
  389.                   IS_SEQUENCE);
  390.  
  391. #define M_ASN1_I2D_len_SEQUENCE_type(type,a,f) \
  392.         ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,V_ASN1_SEQUENCE, \
  393.                         V_ASN1_UNIVERSAL,IS_SEQUENCE)
  394.  
  395. #define M_ASN1_I2D_len_SEQUENCE_opt(a,f) \
  396.         if ((a != NULL) && (sk_num(a) != 0)) \
  397.             M_ASN1_I2D_len_SEQUENCE(a,f);
  398.  
  399. #define M_ASN1_I2D_len_SEQUENCE_opt_type(type,a,f) \
  400.         if ((a != NULL) && (sk_##type##_num(a) != 0)) \
  401.             M_ASN1_I2D_len_SEQUENCE_type(type,a,f);
  402.  
  403. #define M_ASN1_I2D_len_IMP_SET(a,f,x) \
  404.         ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC,IS_SET);
  405.  
  406. #define M_ASN1_I2D_len_IMP_SET_type(type,a,f,x) \
  407.         ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,x, \
  408.                         V_ASN1_CONTEXT_SPECIFIC,IS_SET);
  409.  
  410. #define M_ASN1_I2D_len_IMP_SET_opt(a,f,x) \
  411.         if ((a != NULL) && (sk_num(a) != 0)) \
  412.             ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC, \
  413.                       IS_SET);
  414.  
  415. #define M_ASN1_I2D_len_IMP_SET_opt_type(type,a,f,x) \
  416.         if ((a != NULL) && (sk_##type##_num(a) != 0)) \
  417.             ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,x, \
  418.                            V_ASN1_CONTEXT_SPECIFIC,IS_SET);
  419.  
  420. #define M_ASN1_I2D_len_IMP_SEQUENCE(a,f,x) \
  421.         ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC, \
  422.                   IS_SEQUENCE);
  423.  
  424. #define M_ASN1_I2D_len_IMP_SEQUENCE_opt(a,f,x) \
  425.         if ((a != NULL) && (sk_num(a) != 0)) \
  426.             ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC, \
  427.                       IS_SEQUENCE);
  428.  
  429. #define M_ASN1_I2D_len_IMP_SEQUENCE_opt_type(type,a,f,x) \
  430.         if ((a != NULL) && (sk_##type##_num(a) != 0)) \
  431.             ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,x, \
  432.                             V_ASN1_CONTEXT_SPECIFIC, \
  433.                             IS_SEQUENCE);
  434.  
  435. #define M_ASN1_I2D_len_EXP_opt(a,f,mtag,v) \
  436.         if (a != NULL)\
  437.             { \
  438.             v=f(a,NULL); \
  439.             ret+=ASN1_object_size(1,v,mtag); \
  440.             }
  441.  
  442. #define M_ASN1_I2D_len_EXP_SET_opt(a,f,mtag,tag,v) \
  443.         if ((a != NULL) && (sk_num(a) != 0))\
  444.             { \
  445.             v=i2d_ASN1_SET(a,NULL,f,tag,V_ASN1_UNIVERSAL,IS_SET); \
  446.             ret+=ASN1_object_size(1,v,mtag); \
  447.             }
  448.  
  449. #define M_ASN1_I2D_len_EXP_SEQUENCE_opt(a,f,mtag,tag,v) \
  450.         if ((a != NULL) && (sk_num(a) != 0))\
  451.             { \
  452.             v=i2d_ASN1_SET(a,NULL,f,tag,V_ASN1_UNIVERSAL, \
  453.                        IS_SEQUENCE); \
  454.             ret+=ASN1_object_size(1,v,mtag); \
  455.             }
  456.  
  457. #define M_ASN1_I2D_len_EXP_SEQUENCE_opt_type(type,a,f,mtag,tag,v) \
  458.         if ((a != NULL) && (sk_##type##_num(a) != 0))\
  459.             { \
  460.             v=i2d_ASN1_SET_OF_##type(a,NULL,f,tag, \
  461.                          V_ASN1_UNIVERSAL, \
  462.                          IS_SEQUENCE); \
  463.             ret+=ASN1_object_size(1,v,mtag); \
  464.             }
  465.  
  466. /* Put Macros */
  467. #define M_ASN1_I2D_put(a,f)    f(a,&p)
  468.  
  469. #define M_ASN1_I2D_put_IMP_opt(a,f,t)    \
  470.         if (a != NULL) \
  471.             { \
  472.             unsigned char *q=p; \
  473.             f(a,&p); \
  474.             *q=(V_ASN1_CONTEXT_SPECIFIC|t|(*q&V_ASN1_CONSTRUCTED));\
  475.             }
  476.  
  477. #define M_ASN1_I2D_put_SET(a,f) i2d_ASN1_SET(a,&p,f,V_ASN1_SET,\
  478.             V_ASN1_UNIVERSAL,IS_SET)
  479. #define M_ASN1_I2D_put_SET_type(type,a,f) \
  480.      i2d_ASN1_SET_OF_##type(a,&p,f,V_ASN1_SET,V_ASN1_UNIVERSAL,IS_SET)
  481. #define M_ASN1_I2D_put_IMP_SET(a,f,x) i2d_ASN1_SET(a,&p,f,x,\
  482.             V_ASN1_CONTEXT_SPECIFIC,IS_SET)
  483. #define M_ASN1_I2D_put_IMP_SET_type(type,a,f,x) \
  484.      i2d_ASN1_SET_OF_##type(a,&p,f,x,V_ASN1_CONTEXT_SPECIFIC,IS_SET)
  485. #define M_ASN1_I2D_put_IMP_SEQUENCE(a,f,x) i2d_ASN1_SET(a,&p,f,x,\
  486.             V_ASN1_CONTEXT_SPECIFIC,IS_SEQUENCE)
  487.  
  488. #define M_ASN1_I2D_put_SEQUENCE(a,f) i2d_ASN1_SET(a,&p,f,V_ASN1_SEQUENCE,\
  489.                          V_ASN1_UNIVERSAL,IS_SEQUENCE)
  490.  
  491. #define M_ASN1_I2D_put_SEQUENCE_type(type,a,f) \
  492.      i2d_ASN1_SET_OF_##type(a,&p,f,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL, \
  493.                 IS_SEQUENCE)
  494.  
  495. #define M_ASN1_I2D_put_SEQUENCE_opt(a,f) \
  496.         if ((a != NULL) && (sk_num(a) != 0)) \
  497.             M_ASN1_I2D_put_SEQUENCE(a,f);
  498.  
  499. #define M_ASN1_I2D_put_IMP_SET_opt(a,f,x) \
  500.         if ((a != NULL) && (sk_num(a) != 0)) \
  501.             { i2d_ASN1_SET(a,&p,f,x,V_ASN1_CONTEXT_SPECIFIC, \
  502.                        IS_SET); }
  503.  
  504. #define M_ASN1_I2D_put_IMP_SET_opt_type(type,a,f,x) \
  505.         if ((a != NULL) && (sk_##type##_num(a) != 0)) \
  506.             { i2d_ASN1_SET_OF_##type(a,&p,f,x, \
  507.                          V_ASN1_CONTEXT_SPECIFIC, \
  508.                          IS_SET); }
  509.  
  510. #define M_ASN1_I2D_put_IMP_SEQUENCE_opt(a,f,x) \
  511.         if ((a != NULL) && (sk_num(a) != 0)) \
  512.             { i2d_ASN1_SET(a,&p,f,x,V_ASN1_CONTEXT_SPECIFIC, \
  513.                        IS_SEQUENCE); }
  514.  
  515. #define M_ASN1_I2D_put_IMP_SEQUENCE_opt_type(type,a,f,x) \
  516.         if ((a != NULL) && (sk_##type##_num(a) != 0)) \
  517.             { i2d_ASN1_SET_OF_##type(a,&p,f,x, \
  518.                          V_ASN1_CONTEXT_SPECIFIC, \
  519.                          IS_SEQUENCE); }
  520.  
  521. #define M_ASN1_I2D_put_EXP_opt(a,f,tag,v) \
  522.         if (a != NULL) \
  523.             { \
  524.             ASN1_put_object(&p,1,v,tag,V_ASN1_CONTEXT_SPECIFIC); \
  525.             f(a,&p); \
  526.             }
  527.  
  528. #define M_ASN1_I2D_put_EXP_SET_opt(a,f,mtag,tag,v) \
  529.         if ((a != NULL) && (sk_num(a) != 0)) \
  530.             { \
  531.             ASN1_put_object(&p,1,v,mtag,V_ASN1_CONTEXT_SPECIFIC); \
  532.             i2d_ASN1_SET(a,&p,f,tag,V_ASN1_UNIVERSAL,IS_SET); \
  533.             }
  534.  
  535. #define M_ASN1_I2D_put_EXP_SEQUENCE_opt(a,f,mtag,tag,v) \
  536.         if ((a != NULL) && (sk_num(a) != 0)) \
  537.             { \
  538.             ASN1_put_object(&p,1,v,mtag,V_ASN1_CONTEXT_SPECIFIC); \
  539.             i2d_ASN1_SET(a,&p,f,tag,V_ASN1_UNIVERSAL,IS_SEQUENCE); \
  540.             }
  541.  
  542. #define M_ASN1_I2D_put_EXP_SEQUENCE_opt_type(type,a,f,mtag,tag,v) \
  543.         if ((a != NULL) && (sk_##type##_num(a) != 0)) \
  544.             { \
  545.             ASN1_put_object(&p,1,v,mtag,V_ASN1_CONTEXT_SPECIFIC); \
  546.             i2d_ASN1_SET_OF_##type(a,&p,f,tag,V_ASN1_UNIVERSAL, \
  547.                            IS_SEQUENCE); \
  548.             }
  549.  
  550. #define M_ASN1_I2D_seq_total() \
  551.         r=ASN1_object_size(1,ret,V_ASN1_SEQUENCE); \
  552.         if (pp == NULL) return(r); \
  553.         p= *pp; \
  554.         ASN1_put_object(&p,1,ret,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL)
  555.  
  556. #define M_ASN1_I2D_INF_seq_start(tag,ctx) \
  557.         *(p++)=(V_ASN1_CONSTRUCTED|(tag)|(ctx)); \
  558.         *(p++)=0x80
  559.  
  560. #define M_ASN1_I2D_INF_seq_end() *(p++)=0x00; *(p++)=0x00
  561.  
  562. #define M_ASN1_I2D_finish()    *pp=p; \
  563.                 return(r);
  564.  
  565. int asn1_GetSequence(ASN1_const_CTX *c, long *length);
  566. void asn1_add_error(const unsigned char *address,int offset);
  567. #ifdef  __cplusplus
  568. }
  569. #endif
  570.  
  571. #endif
  572.